package com.skivingcloud.admin.sys.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.skivingcloud.admin.security.SecurityUser;
import com.skivingcloud.admin.sys.entity.SysUser;
import com.skivingcloud.admin.sys.entity.UserQueryParameter;
import com.skivingcloud.admin.sys.vo.AdminRoute;
import com.skivingcloud.admin.sys.vo.AdminRouteVue;
import com.skivingcloud.common.utils.PageParameter;

import java.util.List;
import java.util.Map;

/**
 *  服务层。
 *
 * @author skivingcloud
 * @since 2023-08-28
 */
public interface SysUserService extends IService<SysUser> {
    /**
     * 根据用户名查询用户
     * @param userName 用户名
     * @return 用户对象
     */
    SysUser loadUserByName(String userName);
    
    /**
     * 接口权限
     * @param id 用户id
     * @return 权限列表
     */
    List<String> getUserPermissions(String id);
    
    /**
     * 检查用户名是否重复
     * @param userName 用户名
     * @param tenantId 租户编号
     * @return 是否存在
     */
    boolean checkUserName(String userName, String tenantId);
    
    /**
     * 加载用户的菜单
     * @param user 用户
     * @param terminal 终端Constant.TerminalType
     * @return 菜单
     */
    List<AdminRoute> getAllMenuForUser(SecurityUser user, String terminal);
    
    /**
     * 加载用户的菜单
     * @param user 用户
     * @param terminal 终端Constant.TerminalType
     * @return 菜单
     */
    List<AdminRouteVue> getAllMenuForUserVue(SecurityUser user, String terminal);
    
    /**
     * 分页查询
     *
     * @param parameter 查询参数
     * @return 分页查询结果
     */
    Page<SysUser> queryByPage(PageParameter<SysUser> parameter);
    
    /**
     * 设置用户角色
     * @param sysUser 用户角色信息
     */
    void setUserRolesByUserId(SysUser sysUser);
    
    /**
     * 设置用户岗位
     * @param sysUser 用户岗位信息
     */
    void setUserStationsByUserId(SysUser sysUser);
    
    /**
     * 设置用户资源
     * @param sysUser 用户资源信息
     */
    void setUserMenuByUserId(SysUser sysUser);
    
    /**
     * 获取用户信息，包含机构名称
     * @param id 用户id
     */
    SysUser getUserIncludeById(String id);
    
    /**
     * 根据岗位ID和用户ID查询用户姓名
     * @param parameter 参数
     * @return 逗号隔开的用户姓名
     */
    String getUserNameByStationIdsAndUserIds(UserQueryParameter parameter);
    
    /**
     * 获取本租户下用户信息{key，value}
     * @param currentUser 用户
     * @return 用户信息
     */
    List<Map<String, Object>> getAllUserBySelfTenant(SecurityUser currentUser);
    
    /**
     * 获取本租户下用户ID
     * @param currentUser 用户
     * @return 用户ID
     */
    List<String> getAllUserIdsBySelfTenant(SecurityUser currentUser);
}
